java读取Excel文档 + 存入数据库 |
您所在的位置:网站首页 › java excel导入数据到数据库 › java读取Excel文档 + 存入数据库 |
序
在做项目的时候,我们有时想要读取Excel类型的文档,把表格里面的数据进行处理,比如把成绩Excel文档存储到数据库对应的表。而这时却不知道该如何操作,接下来我将讲解这个流程。以下面的数据为例 1、想要读取Excel文件,必须要获得文件的位置,就是文件路径,看看文件在哪个文件夹里,复制文件夹的路径,并在java中定义。 2、获得路径后,通过路径定位生成数据流,使用FileInputStream方法读取路径对应文件的原始字节流。 3、使用ExcelUtils工具类读取 字节流 + 路径。 4、ExcelUtils工具类对数据进行处理,因为表格有行和列,所以处理完数据使用二维集合List对数据进行存储。 5、已经获取到了Excel表格中所有的数据,包含所有的行和列,都在List中,这一步所有的数据获取完了,如果没有将数据存储到数据库的需求,那已经结束了。 6、有了数据,要将数据存储到数据库。 7、需要创建数据库字段的实体类(POJO类),使用@Excel注解将表格和数据库字段名一一对应 8、通过双重 for循环遍历List,内层List为列,外层List为行,如下图将第一行数据单独拿出来,作为判断字段,如果实体类等@Excel注解属性和Excel表格第一行名字相同,对实体类进行set赋值。如有疑惑,可以结合代码来理解。 9、从第二行开始,每遍历完一行,将获得一个实体类对象,因为是结合数据库写的实体类,通过springboot可以直接插入数据库。 10、通过读取成功插入到数据库 下面是读取excel的工具类,可以自己在目录中建立这个类并把代码复制过去,我们使用的是ExcelUtils.getListByExcel方法,遍历所有的行和列并用List list存储。内层List是列,外层List是行 public class ExcelUtils { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007版本 /** * @Description:获取IO流中的数据,组装成List对象 * @param in,fileName * @return * @throws */ public static List getListByExcel(InputStream in, String fileName) throws Exception{ List list = null; //创建Excel工作薄 Workbook work = getWorkbook(in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; //页数 Row row = null; //行数 Cell cell = null; //列数 list = new ArrayList(); //遍历Excel中所有的sheet for (int i = 0; i continue;} //遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum(); j continue;} //遍历所有的列 List li = new ArrayList(); for (int y = row.getFirstCellNum(); y Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有误!"); } return wb; } /** * @Description:对表格中数值进行格式化 * @param cell * @return */ //解决excel类型问题,获得数值 public static String getValue(Cell cell) { String value = ""; if(null==cell){ return value; } switch (cell.getCellType()) { //数值型 case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { //如果是date类型则 ,获取该cell的date值 Date date = DateUtil.getJavaDate(cell.getNumericCellValue()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); value = format.format(date);; }else {// 纯数字 BigDecimal big=new BigDecimal(cell.getNumericCellValue()); value = big.toString(); //解决1234.0 去掉后面的.0 if(null!=value&&!"".equals(value.trim())){ String[] item = value.split("[.]"); if(1// 如果获取的数据值为非法值,则转换为获取字符串 value = cell.getStringCellValue(); } break; // 布尔类型 case BOOLEAN: value = " "+ cell.getBooleanCellValue(); break; default: value = cell.getStringCellValue(); } if("null".endsWith(value.trim())){ value=""; } return value; } }上面的TestExcel.setFieldValueByFieldName(questionBank, firstRows.get(j).toString().trim(), cellVal)代码讲解, 对Excel每一行中的所有值执行这个方法,可以判断每个值是否与注解的字段对应,如果对应,进行类型判断,并且赋值。 public class TestExcel { /** * 用反射方法,获取列名,比较,为属性赋值 * @param object * @param fieldName * @param val */ public static void setFieldValueByFieldName(Object object, String fieldName, Object val) { try { //通过反射获取所有实体类所有定义的方法,object为数据库实体类 Field[] fields = object.getClass().getDeclaredFields(); //遍历fields for (int i = 0; i if(fieldName.equals(field.getName())){ if(field.getType() == Integer.class){ field.set(object, Integer.valueOf(val.toString())); }else if(field.getType() == Long.class){ field.set(object, Long.valueOf(val.toString())); }else { field.set(object, val); } return; } }else {//设置了注解,并且表格里的Excel字段值和注解的name值相同,则为相应字段赋值 if(fieldName.equals(annotation.name())){ //进行类型判断,因为实体类中变量类型不同。 if(field.getType() == Integer.class){ field.set(object, Integer.valueOf(val.toString())); }else if(field.getType() == Long.class){ field.set(object, Long.valueOf(val.toString())); }else { field.set(object, val); } return; } } } }catch (Exception e){ e.printStackTrace(); } } }实体类代码,通过反射获取fields列表,fields为每一个变量如id、questionId、screenShare等,通过读取注解@Excel获得name值如序号、题目ID、屏幕共享等,这些注解和表格的第一行一一对应,通过上面的遍历为变量赋值,最终获取已经Set好值得实体类,使用springboot直接save到数据库里。 @Data @TableName("t_question_bank")//数据库名字 public class QuestionBank { @TableId(type = IdType.AUTO) @Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC) private Long id; @Excel(name = "题目ID") private Long questionId; @Excel(name = "屏幕共享") private String screenShare; @Excel(name = "试题") private String question; @Excel(name = "答案") private String answer; @Excel(name = "评分标准") private String scoreCriteria; }经过这样的操作,读取Excel文档 + 存入数据库的功能已经实现啦 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |